home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_02_10 / 2n10030a < prev    next >
Text File  |  1991-08-25  |  29KB  |  971 lines

  1.     Page    60,132
  2. ;---------------------------------------------------------------
  3. ;               BEGIN LISTING 1
  4. ;---------------------------------------------------------------
  5. ;
  6. ; 286LOAD.ASM    Copyright (c) 1991 Robert Collins
  7. ;
  8. ;    This program demonstrates various aspects of CPU
  9. ;    behavior that become apparent when using LOADALL.
  10. ;
  11. ;    Test 1:  Checks that LOADALL loads all the general-
  12. ;         purpose registers; loads the segment registers
  13. ;         with values that are inconsistant to their
  14. ;         respective descriptor cache registers.
  15. ;
  16. ;    Test 2:  Access extended memory in real mode.
  17. ;
  18. ;    Test 3:  Tests that the Present bit in a descriptor
  19. ;         table can be loaded using LOADALL without
  20. ;         generating exception 11.  But when the segment
  21. ;         is accessed, exception 13 is generated.
  22. ;         NOTE:    This test should be done in protected
  23. ;         mode, but can be done in real mode.  1) In real
  24. ;         mode, no error code is pushed on the stack
  25. ;         (possibly due to a bug in the CPU).  2) Also
  26. ;         in real mode, when this program is emulated on
  27. ;         a '386, the '386 fails to set the Present bit
  28. ;         when any subsequent segment in loaded.  This
  29. ;         latter condition is clearly a bug in the '386.
  30. ;
  31. ;    This program was written for Microsoft MASM 5.1, and
  32. ;    MS DOS 3.3.  This program contains compiler directives
  33. ;    and branching techniques that might not be available
  34. ;    on previous versions of the Macro Assembler, nor in
  35. ;    competitive products.  If this program is executed on
  36. ;    any version of DOS prior to 3.3, it will most certainaly
  37. ;    cause the system to crash.  No attempt is made in this
  38. ;    program to be compatible with previous versions of DOS,
  39. ;    but compatibility can be done, and is left as an
  40. ;    exercise to the reader.
  41. ;
  42. ;---------------------------------------------------------------
  43.  
  44. ;---------------------------------------------------------------
  45. ; Compiler directives
  46. ;---------------------------------------------------------------
  47.     Title    LOADALL_286
  48.     .radix    16
  49.     .8086
  50.  
  51.  
  52. ;---------------------------------------------------------------
  53. ; Interrupt vector segment
  54. ;---------------------------------------------------------------
  55. ABS0    segment at 0
  56.     org 06h*4            ; INT 06h vector
  57.     INT_6        dd    ?
  58.  
  59.     org      0467h         ; PM Return address
  60.     PM_Ret_off    dw    ?    ;  Offset
  61.     PM_Ret_seg    dw    ?    ;  Segment
  62.  
  63.     org    800h            ; LOADALL table loc'n.
  64.     Loadall_Locn    label    word
  65.  
  66. ABS0    ends
  67.  
  68.  
  69. ;---------------------------------------------------------------
  70. ; Structure definitions
  71. ;---------------------------------------------------------------
  72. Desc_cache    STRUC        ;; Hidden descriptor cache
  73.     A15_A00 dw    ?    ;;  format.
  74.     A23_A16 db    ?
  75.     _Type    db    ?
  76.     _Limit    dw    ?
  77. Desc_cache    ENDS
  78.  
  79.  
  80. Loadall_struc    STRUC        ;; LOADALL memory image format
  81.             dw    3 dup (0)
  82.     _Msw        dw    0
  83.             dw    7 dup (0)
  84.     _Tr        dw    0
  85.     _Flags        dw    2
  86.     _Ip        dw    0
  87.     _Ldt        dw    0
  88.     _Ds        dw    2222h
  89.     _Ss        dw    4444h
  90.     _Cs        dw    1111h
  91.     _Es        dw    3333h
  92.     _Di        dw    6666h
  93.     _Si        dw    7777h
  94.     _Bp        dw    5555h
  95.     _Sp        dw    8888h
  96.     _Bx        dw    2222h
  97.     _Dx        dw    4444h
  98.     _Cx        dw    3333h
  99.     _Ax        dw    1111h
  100.     ES_Desc     db    00,00,03,93h,0ffh,0ffh
  101.     CS_Desc     db    00,00,00,9bh,0ffh,0ffh
  102.     SS_Desc     db    00,00,04,93h,0ffh,0ffh
  103.     DS_Desc     db    00,00,02,93h,0ffh,0ffh
  104.     Gdt_Desc    db    00,00,00,00h,000h,000h
  105.     Ldt_Desc    db    00,00,06,82h,088h,000h
  106.     Idt_Desc    db    00,00,00,00h,0ffh,003h
  107.     TSS_Desc    db    00,00,05,89h,000h,008h
  108. Loadall_Struc    ENDS
  109.  
  110.  
  111. Descriptor  STRUC
  112.     Seg_limit        dw        ?    ; Segment limit
  113.     Base_A15_A00    dw        ?    ; A00..A15 of base address
  114.     Base_A23_A16    db        ?    ; A16..A23 of base address
  115.     Access_rights   db        ?    ; Segment access rights
  116.     Limit_A19_A16   db        ?    ; Granularity, Op-size,
  117.                 ;  Limit A16..A19
  118.     Base_A31_A24    db        ?    ; A24..A31 of base address
  119. Descriptor  ENDS
  120.  
  121.  
  122. INT_Desc    STRUC
  123.     IGate_Offset    dw        ?    ; Offset of handler
  124.     CSEG_Sel        dw        ?    ; Code segment selector
  125.             db        0
  126.             db        86h ; 286 interrupt gate=16bit
  127.                 ;  CS:IP, FLAGS
  128.     Resvd        dw        0    ; Reserved=0
  129. INT_Desc    ENDS
  130.  
  131.  
  132. ;---------------------------------------------------------------
  133. ; Macro definitions
  134. ;---------------------------------------------------------------
  135. FARJMP    MACRO    destination,selector    ; dynamic JMP FAR SEG:OFF
  136.     db    0eah            ;; jmp instruction
  137.     dw    offset destination    ;; offset word
  138.     dw    selector        ;; segment selector word
  139.     endm
  140.  
  141.  
  142. IO_DELAY    MACRO
  143.     out    0edh,ax
  144.     endm
  145.  
  146. LOADALL     MACRO
  147.     mov    cx,ABS0
  148.     mov    es,cx
  149.     mov    cx,(size Loadall_struc) / 2
  150.     mov    si,offset Loadall_tbl
  151.     mov    di,800h
  152.     rep    movsw
  153.     db    0fh,05
  154.     ENDM
  155.  
  156. PRINT_STRING    MACRO    MSG_NAME
  157.     mov    ah,9
  158.     mov    dx,offset MSG_NAME
  159.     int    21h
  160.     ENDM
  161. ;--------------------------------------------------------------
  162.  
  163.  
  164.     _DATA     SEGMENT PARA PUBLIC 'DATA'
  165. ;---------------------------------------------------------------
  166. ; Equates & local variables
  167. ;---------------------------------------------------------------
  168. ; Protected mode access rights
  169. ;---------------------------------------------------------------
  170.     CS_access    equ    10011011b
  171.     DS_access    equ    10010011b
  172.  
  173. ;---------------------------------------------------------------
  174. ; Text equates
  175. ;---------------------------------------------------------------
  176.     CRLF        equ    <0dh,0ah>
  177.     CRLF$        equ    <CRLF,'$'>
  178.     INT6        equ    [bp-4]
  179.  
  180. ;---------------------------------------------------------------
  181. ; Conditional compilation.  Set USE_386=1 if you plan to execute
  182. ; this program on a '386 using EMULOAD.
  183. ;---------------------------------------------------------------
  184.     USE_386     equ    0
  185.  
  186.  
  187. ;---------------------------------------------------------------
  188. ; Loadall table(s)
  189. ;---------------------------------------------------------------
  190.     Loadall_tbl    Loadall_struc <>
  191.     Machine_State    Loadall_struc <>
  192.  
  193. ;---------------------------------------------------------------
  194. ; Global Descriptor Table
  195. ;---------------------------------------------------------------
  196.     GDT_286 Descriptor    <Gdt2_len-1,,,DS_access>
  197.     CSEG2    Descriptor    <0ffffh,,,CS_access>    ; CS
  198.     DSEG2    Descriptor    <0ffffh,,,DS_access>    ; DS
  199.     Gdt2_len      equ    $-Gdt_286
  200.  
  201. ;---------------------------------------------------------------
  202. ; Interrupt Descriptor Table
  203. ;---------------------------------------------------------------
  204. IDT_286 INT_Desc    <Offset INT13,CSEG2-GDT_286>    ; INT00
  205.     INT_Desc    <Offset INT13,CSEG2-GDT_286>    ; INT01
  206.     INT_Desc    <Offset INT13,CSEG2-GDT_286>    ; INT02
  207.     INT_Desc    <Offset INT13,CSEG2-GDT_286>    ; INT03
  208.     INT_Desc    <Offset INT13,CSEG2-GDT_286>    ; INT04
  209.     INT_Desc    <Offset INT13,CSEG2-GDT_286>    ; INT05
  210.     INT_Desc    <Offset INT13,CSEG2-GDT_286>    ; INT06
  211.     INT_Desc    <Offset INT13,CSEG2-GDT_286>    ; INT07
  212.     INT_Desc    <Offset INT13,CSEG2-GDT_286>    ; INT08
  213.     INT_Desc    <Offset INT13,CSEG2-GDT_286>    ; INT09
  214.     INT_Desc    <Offset INT13,CSEG2-GDT_286>    ; INT0a
  215.     INT_Desc    <Offset INT13,CSEG2-GDT_286>    ; INT0b
  216.     INT_Desc    <Offset INT13,CSEG2-GDT_286>    ; INT0c
  217.     INT_Desc    <Offset INT13,CSEG2-GDT_286>    ; INT0d
  218. IDT2_Len    equ    $-IDT_286
  219.  
  220. ;---------------------------------------------------------------
  221. ; Misc. local variables
  222. ;---------------------------------------------------------------
  223. Mem_buffer    db    400h dup (0)
  224. Results     dw    0
  225. i8259_1     db    ?    ; Status for master device
  226. i8259_2     db    ?    ; Status of slave device
  227.  
  228.  
  229. ;---------------------------------------------------------------
  230. ; String Messages
  231. ;---------------------------------------------------------------
  232. Passed    db    "    PASSED.",CRLF$
  233. Failed    db    "--> FAILED <--",CRLF$
  234. Not_286 db    "Not 80286 class computer.",CRLF$
  235. Rmvd    db    "LOADALL removed from 80286 mask.",CRLF$
  236. RFail    db    "Registers weren't loaded correctly."
  237. LF    db     CRLF$
  238.  
  239. ;---------------------------------------------------------------
  240. ; I'm doing this wierd string definition technique to limit the
  241. ; page width to 64 characters.
  242. ;---------------------------------------------------------------
  243. Test_1    label    word
  244. db    "Test 1:  Testing 286 LOADALL instruction:         ",24
  245.  
  246. Test_2    label    word
  247. db    "Test 2:  Testing extended memory in real mode:    ",24
  248.  
  249. Test_3    label word
  250. db    "Test 3:  Testing Present BIT in descriptor:       ",24
  251.  
  252. _DATA     ends
  253.  
  254.  
  255.     _TEXT    SEGMENT PARA PUBLIC 'CODE'
  256.     ASSUME    CS:_TEXT, DS:_DATA, ES:_DATA, SS:STACK
  257.     .286p
  258. ;------------------------------